from typing import Optional, List
import uvicorn
from fastapi import FastAPI, Header

app = FastAPI()

# 获取 Header
@app.get("/items/")
async def read_items(accept_encoding: Optional[str] = Header(None)):
    return {"Accept-Encoding": accept_encoding}


'''
    函数参数命名为 accept_encoding 为什么能识别到 Accept-Encoding？
    首先，Accept-Encoding 这种变量名在 Python 是无效的
    因此， Header 默认情况下，会用下划线 _ 代替 - ，这就是 convert_underscores 参数的作用
    重点：HTTP Header 是不区分大小写的，所以写 accept_encoding 还是 Accept_Encoding 是一样效果的
'''


# 多个重名 Header
# 假设一个 Request Header 里面有多个重名的 Header，那可以用 List[str] 来声明参数类型

# @app.get("/items/")
# async def read_items(x_token: Optional[List[str]] = Header(None)):
#     return {"X-Token values": x_token}


from starlette.responses import JSONResponse


@app.get("/header/")
def Login():
    content = {
        "name": "poloyy",
        "age": 10
    }
    response = JSONResponse(content=content)
    token = {
        "x-token-name": "token",
        "x-token-value": "test_header"
    }
    # 设置 Header
    response.init_headers(token)
    return response


if __name__ == "__main__":
    uvicorn.run(app="main:app", host="127.0.0.1", port=8000, reload=True, debug=True)
